/**********************************************************************************\
** 文件名称: list.h
** 创建人员: YCG
** 创建日期: 2018-12-14
** 文档描述:
** 版本代号: V0.1
** 版本说明: 初始版本
\********************************************************************************/
#ifndef __LIST_H_
#define __LIST_H_
#include	"main.h"

#ifndef NULL
#define NULL  0U
#endif

#define LIST_VALUE_MAX   0xFFFFFFFF

struct ListItem_struct;
typedef struct ListItem_struct ListItem_t;

struct List_struct;
typedef struct List_struct List_t;
// 定义列表项结构体 占用空间 20 字节
struct ListItem_struct
{
    ListItem_t      *Pre;        //指向上一个一个列表项
    ListItem_t      *Next;       //指向下一个列表项
    List_t          *Head;       //所属的列表
    uint32_t         Value;      //列表项的值
    void *          DatPot;      //列表项带有的数据
};

// 定义列表结构体 占用空间 32 字节
struct List_struct
{
    ListItem_t*  Index;         //此时的地址
    uint32_t     ListNum;       //列表项的数量
    void *       DatPot;        //表头带有的数据
	
    ListItem_t   EndItem;       //尾地址
} ;

//将当前的索引位置定位到第一个列表项
#define LIST_TO_HEAD(list)  (list->Index = list->EndItem.Next)

//获取第一个列表项
#define LIST_GET_HEAD(list)  (list->EndItem.Next)

//切换到下一个列表项
#define LIST_TO_NEXT(list)  (list->Index = list->Index->Next)
#define LISTITEM_TO_NEXT(listItem)  (listItem = listItem->Next)

//判断是不是到了列表的末尾
#define LIST_IS_END(list)   (list->Index ==&(list->EndItem))

//判断是不是到了列表的末尾
#define LIST_IS_NOT_END(list)   (list->Index !=&(list->EndItem))
#define LISTITEM_IS_NOT_END(listItem)   (listItem !=&(listItem->Head->EndItem))

//循环切换到下一个列表项
#define LIST_TO_C_NEXT(list) \
												do{\
													LIST_TO_NEXT(list);\
													if(LIST_IS_END(list)){\
													LIST_TO_HEAD(list);\
													}\
												}while(0)	
												
//获取列表中的列表项数量												
#define LIST_GET_NUM(list) (list->ListNum)
		
//比较列表项的值 等于给定的值																			
#define ITEM_IS_EQ_VALUE(item，value)  (item->Value == value)
		
//比较列表项的值 大于给定的值																			
#define ITEM_IS_GT_VALUE(item，value)  (item->Value > value)
		
//比较列表项的值 小于给定的值																			
#define ITEM_IS_LT_VALUE(item，value)  (item->Value < value)
		
//比较列表项的值 大于等于给定的值																			
#define ITEM_IS_EGT_VALUE(item，value)  (item->Value >= value)
		
//比较列表项的值 小于等于给定的值																			
#define ITEM_IS_ELT_VALUE(item，value)  (item->Value <= value)
												
//设置列表项的值																		
#define ITEM_SET_VALUE(item，value)  (item->Value = value)
		
void ListInit(List_t * const pxList);
void ListItemInit(ListItem_t * const pxItem);
void ListInsertEnd(List_t * const pxList, ListItem_t * const pxNewItem);
void ListInsert(List_t * const pxList, ListItem_t * const pxNewItem);
void ListRemove(ListItem_t * const pxRemoveItem);
void ListPrint(List_t * const pxList);
#endif

/********************************End of File************************************/
